// typeof 和 instanceOf 的区别
// 1. typeof 原始类型 typeof null === 'object'
// 2. [] {} reg function

console.log(typeof []) // object
console.log(typeof new RegExp('/A/')) // object
console.log(typeof function() {}) // function
// typeof 如果是函数就返回函数
class A {

}
let a = new A()
// console.log(Object.prototype.toString.call([]))
// console.log(Object.prototype.toString.call(function() {}))
// // 不能校验自定义类型
// console.log(Object.prototype.toString.call(a))

// console.log([] instanceof Array)
// console.log([] instanceof Object)

// console.log([].__proto__ === Array.prototype)
// console.log([].__proto__.__proto__ === Object.prototype)


function instanceOf(A, B) {
    B = B.prototype
    A = A.__proto__
    while(true) { // Object.prototype.__proto__
        if(A === null) {
            return false
        }
        if(A === B) {
            return true
        }
        A = A.__proto__
    }
    
}
console.log(instanceOf(a, A)) 

let str = 'hello'
console.log(str instanceof String)

// Symbol.hasInstance
console.log(String[Symbol.hasInstance](str))

class ValidateStr {
    static [Symbol.hasInstance](x) {
        return typeof x === 'string'
    }
}

console.log(ValidateStr[Symbol.hasInstance]('hello'))
console.log('hello' instanceof ValidateStr)

// 找对象的 constructor